#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

#include "http.h"

void print_usage(const char *cmd)
{
  fprintf(stderr, "Uso:\n"
    "\t%s [-f] <url> <arquivo>\n"
    "\t-f forca a sobrescrita do arquivo de destino\n",
    cmd
  );
}

int main(int argc, char ** argv)
{
  const char *url, *filename;
  int status = 0;
  FILE *file = 0;
  int force = 0;
  char *response_header = 0;
  
  if (argc < 3)
  {
    print_usage(argv[0]);
    exit(1);
  }
  
  if (argc > 3 && (argv[1][0] == '-' && argv[1][1] == 'f'))
  {
    force = 1;
    url = argv[2];
    filename = argv[3];
  }
  else
  {
    force = 0;
    url = argv[1];
    filename = argv[2];
  }
  
  /* tem que comecar com http:// */
  if (strstr(url, "http://") != url) {
    fprintf(stderr, "Protocolo nao reconhecido.\nApenas o protocolo HTTP eh suportado\n");
    exit(1);
  }
  
  if ((access(filename, F_OK) != -1) && !force) {
    fprintf(stderr, "Arquivo %s ja existe. Use -f para sobrescrever\n", filename);
    print_usage(argv[0]);
    
    exit(1);
  }
  
  url = url+7; /* aponta para depois do http:// */
  
  file = fopen(filename, "w");
  if (file == NULL) {
    fprintf(stderr, "Erro ao tentar abrir arquivo %s para leitura: %s\n",
            filename, strerror(errno));
    exit(1);
  }
  
  do
  {
    status = http_get(url, file, &response_header);
    printf("Status: %d. ", status);
    if (status < 0)
    {
      printf("O programa encontrou um erro. Saindo...\n");
      break;
    }
    if (status != 200 && status < 400)
    {
      url = strstr(response_header, "Location: ");
      url = index(url, ':'); url += 2;
      *index(url, '\r') = '\0';
      printf("Redirecionado para %s\n", url);
      url+=7;
    }
    
    if (status >= 400)
    {
      if (status >= 500)
        printf("Server error.\n");
      else
        printf("Client error.\n");
      break;
    }
  } while (status != 200);
  
  printf("\n");

  free(response_header);
  fclose(file);
  
  return 0;
}